home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / tools / winlupe / source / zoom.s < prev   
Encoding:
Text File  |  1994-09-22  |  8.0 KB  |  545 lines

  1.  
  2.         EXPORT  zoom_var
  3.         EXPORT    zoom_inter
  4.         EXPORT  zoom_pixel
  5.  
  6.         EXPORT  init_zoom_var
  7.         EXPORT    init_zoom_pixel
  8.  
  9.         EXPORT    cache_flush
  10.  
  11.         IMPORT  p_faktor
  12.         IMPORT    ind_tab
  13.         IMPORT    longs
  14.         IMPORT    il_offset
  15.  
  16. ; void init_zoom_var()
  17.  
  18. init_zoom_var:
  19.         move.l    d3,-(sp)
  20.  
  21.         moveq.l    #0,d3
  22.         move.w    p_faktor,d0
  23.         btst    #0,d0
  24.         bne.s    odd
  25.  
  26.         moveq.l    #-1,d3
  27.  
  28. odd:    lea.l    make_zoom(pc),a1
  29.         moveq.l    #1,d2
  30. twice_copy:
  31.         move.l    x_loop(pc),(a1)+
  32.  
  33.         move.w    p_faktor,d0
  34.         cmp.w    #4,d0
  35.         beq.s    copy_4
  36.         cmp.w    #3,d0
  37.         beq.s    copy_3
  38.         cmp.w    #2,d0
  39.         bne.s    copy_v
  40.  
  41. copy_2:    lea.l    x_loop_2(pc),a0
  42.         move.l    (a0)+,(a1)+
  43.         move.w    (a0),(a1)+
  44.         bra.s    twice
  45.  
  46. copy_3:    lea.l    x_loop_3(pc),a0
  47.         bra.s    copy_x
  48.  
  49. copy_4: lea.l    x_loop_4(pc),a0
  50.         move.l    (a0)+,(a1)+
  51.         move.l    (a0),(a1)+
  52.         bra.s    twice
  53.  
  54. copy_v: lea.l    x_loop_v(pc),a0
  55. copy_x:    move.l    (a0)+,(a1)+
  56.         move.l    (a0),(a1)+
  57.  
  58.         tst.b    d3
  59.         bne.s    word_long
  60.  
  61.         subq.w    #1,d0
  62.         move.w    bmove(pc),d1
  63.  
  64.         tst.w    d2
  65.         beq.s    byte_copy
  66.  
  67.         addq.w    #1,d0
  68. word_long:
  69.         lsr.w    #1,d0
  70.         subq.w    #1,d0
  71.         beq.s    word_copy
  72.  
  73.         move.w    lmove(pc),d1
  74. long_copy:
  75.         move.w    d1,(a1)+
  76.         subq.w    #2,d0
  77.         bgt.s    long_copy
  78.         bmi.s    last_byte
  79.  
  80. word_copy:
  81.         move.w    wmove(pc),d1
  82. byte_copy:
  83.         move.w    d1,(a1)+
  84.         dbra    d0,byte_copy
  85.  
  86. last_byte:
  87.         tst.b    d3
  88.         bne.s    twice
  89.  
  90.         tst.w    d2
  91.         beq.s    twice
  92.  
  93.         move.w    bmove(pc),(a1)+
  94.  
  95. twice:    dbra    d2,twice_copy
  96.  
  97.         lea.l    make_zoom-2(pc),a0
  98.         sub.l    a1,a0
  99.         move.w    a0,next_xv+2
  100.  
  101.         move.l    next_xv(pc),(a1)+
  102.  
  103.         move.w    p_faktor,d0
  104.         subq.w    #1,d0
  105.  
  106.         cmp.w    #6,d0
  107.         bge.s    to_big
  108.  
  109.         mulu.w    p_faktor,d0
  110.         subq.w    #1,d0
  111.         move.w    y_loop_v(pc),(a1)+
  112.         bra.s    do_copy
  113.  
  114. to_big:    move.w    x_copy_v(pc),(a1)+
  115.  
  116. do_copy:move.l    a1,d3
  117.  
  118. l_copy:    tst.w    d0
  119.         beq.s    w_copy
  120.         bmi.s    copy_loop
  121.  
  122.         move.w    move_l(pc),(a1)+
  123.         subq.w    #2,d0
  124.         bra.s    l_copy
  125.  
  126. w_copy:    move.w    move_w(pc),(a1)+
  127.  
  128. copy_loop:
  129.         sub.l    a1,d3
  130.         subq.w    #2,d3
  131.         move.w    d3,next_cv+2
  132.         move.l    next_cv(pc),(a1)+
  133.  
  134.         lea.l    y_loop_v-2(pc),a0
  135.         sub.l    a1,a0
  136.         move.w    a0,next_yv+2
  137.         move.l    next_yv(pc),(a1)+
  138.  
  139.         lea.l    planes_v-2(pc),a0
  140.         sub.l    a1,a0
  141.         move.w    a0,next_pv+2
  142.  
  143.         lea.l    next_pv(pc),a0
  144.         move.l    (a0)+,(a1)+
  145.         move.l    (a0)+,(a1)+
  146.         move.w    (a0),(a1)
  147.  
  148.         move.l    (sp)+,d3
  149.         rts
  150.  
  151. ; void zoom_var(int wd, int h, int pl,int *s, int *d)
  152. ;                    d0       d1       d2      a0      a1
  153.  
  154. zoom_var:
  155.         movem.l    d3-d5/a2-a6,-(sp)
  156.  
  157.         lea.l    ind_tab,a2
  158.         move.l    (a2),a6
  159.  
  160.         move.w    p_faktor,d5
  161.         subq.w    #1,d5
  162.         cmp.w    #5,d5
  163.         ble.s    small
  164.  
  165.         move.w    d5,d3    ; (faktor-1)*wd-1
  166.         mulu.w    d0,d3
  167.         subq.w    #1,d3
  168.         move.w    d3,a5
  169.  
  170. small:    subq.w    #1,d0
  171.         subq.w    #1,d1
  172.         subq.w    #1,d2
  173.  
  174. planes_v:
  175.         move.w    d1,d5
  176.  
  177. y_loop_v:
  178.         move.w    d0,d3
  179.         move.l    a1,a3
  180.  
  181. make_zoom:
  182.         dcb.w    120,0
  183.  
  184. x_loop:
  185.         moveq.l    #0,d4
  186.         move.b    (a0)+,d4
  187.  
  188. next_xv:dbra    d3,make_zoom
  189.  
  190. x_copy_v:
  191.         move.w    a5,d3
  192. next_cv:dbra    d3,x_copy_v
  193. next_yv:dbra    d5,y_loop_v
  194. next_pv:dbra    d2,planes_v
  195.  
  196.         movem.l (sp)+,d3-d5/a2-a6
  197.         rts
  198.  
  199. move_w:    move.w    (a3)+,(a1)+
  200. move_l:    move.l    (a3)+,(a1)+
  201.  
  202. x_loop_v:
  203.         add.w    d4,d4
  204.         add.w    d4,d4
  205.         move.l    (a2,d4.w),a4
  206.  
  207. x_loop_2:
  208.         add.w    d4,d4
  209.         move.w    (a6,d4.w),(a1)+
  210.  
  211. x_loop_3:
  212.         add.w    d4,d4
  213.         add.w    d4,d4
  214.         lea.l    (a6,d4.w),a4
  215.  
  216. x_loop_4:
  217.         add.w    d4,d4
  218.         add.w    d4,d4
  219.         move.l    (a6,d4.w),(a1)+
  220.  
  221. lmove:    move.l    (a4)+,(a1)+
  222. wmove:    move.w    (a4)+,(a1)+
  223. bmove:    move.b    (a4)+,(a1)+
  224.  
  225. ; void init_zoom_pixel(int bytes,int invert)
  226. ;                           d0         d1
  227.  
  228. init_zoom_pixel:
  229.         move.l    a2,-(sp)
  230.  
  231.         subq.w    #1,d0    ; (bytes-1)*4
  232.         add.w    d0,d0
  233.         add.w    d0,d0
  234.  
  235.         lea.l    make_pixel(pc),a0
  236.  
  237.         tst.w    d1
  238.         bne.s    invert
  239.  
  240.         lea.l    pixel_tab(pc),a1
  241.         bra.s    tabelle
  242.  
  243. invert:    lea.l    pixel_tab_inv(pc),a1
  244.  
  245. tabelle:add.w    d0,a1
  246.         move.l    (a1),a1
  247.  
  248.         move.w    (a1)+,d1
  249.         bmi.s    copy
  250. init_code:
  251.         move.w    (a1)+,(a0)+
  252.         dbra    d1,init_code
  253.  
  254. copy:    move.w    (a1)+,d1
  255.         move.w    p_faktor,d2
  256.         subq.w    #1,d2
  257.  
  258. copy_code:
  259.         move.l    a1,a2
  260.         move.w    d1,d0
  261. copy_instr:
  262.         move.w    (a2)+,(a0)+
  263.         dbra    d0,copy_instr
  264.         dbra    d2,copy_code
  265.  
  266.         lea.l    make_pixel-2(pc),a1
  267.         sub.l    a0,a1
  268.         move.w    a1,next_xp+2
  269.  
  270.         lea.l    next_xp(pc),a1
  271.         moveq.l    #(next_yp-next_xp)/2-1,d0
  272. loop_code:
  273.         move.w    (a1)+,(a0)+
  274.         dbra    d0,loop_code
  275.  
  276.         lea.l    y_loop_p-2(pc),a1
  277.         sub.l    a0,a1
  278.         move.w    a1,next_yp+2
  279.  
  280.         lea.l    next_yp(pc),a1
  281.         move.l    (a1)+,(a0)+
  282.         move.l    (a1)+,(a0)+
  283.         move.w    (a1),(a0)
  284.  
  285.         move.l    (sp)+,a2
  286.         rts
  287.  
  288. pixel_tab:
  289.         dc.l byte_1,byte_2,byte_3,byte_4
  290. pixel_tab_inv:
  291.         dc.l byte_i_1,byte_i_2,byte_i_3,byte_i_4
  292.  
  293. byte_1: dc.w    0            ; init-Befehle - 1
  294.         move.b    (a0)+,d6
  295.         dc.w    0            ; copy-Befehle - 1
  296.         move.b    d6,(a1)+
  297.  
  298. byte_2: dc.w    0
  299.         move.w    (a0)+,d6
  300.         dc.w    0
  301.         move.w    d6,(a1)+
  302.  
  303. byte_4: dc.w    0
  304.         move.l    (a0)+,d6
  305.         dc.w    0
  306.         move.l    d6,(a1)+
  307.  
  308. byte_3: dc.w    2
  309.         move.b    (a0)+,d5
  310.         move.b    (a0)+,d6
  311.         move.b    (a0)+,d7
  312.         dc.w    2
  313.         move.b    d5,(a1)+
  314.         move.b    d6,(a1)+
  315.         move.b    d7,(a1)+
  316.  
  317. byte_i_1:dc.w    1            ; init-Befehle - 1
  318.         move.b    (a0)+,d6
  319.         not.b    d6
  320.         dc.w    0            ; copy-Befehle - 1
  321.         move.b    d6,(a1)+
  322.  
  323. byte_i_2:dc.w    1
  324.         move.w    (a0)+,d6
  325.         not.w    d6
  326.         dc.w    0
  327.         move.w    d6,(a1)+
  328.  
  329. byte_i_4:dc.w    1
  330.         move.l    (a0)+,d6
  331.         not.l    d6
  332.         dc.w    0
  333.         move.l    d6,(a1)+
  334.  
  335. byte_i_3:dc.w    5
  336.         move.b    (a0)+,d5
  337.         move.b    (a0)+,d6
  338.         move.b    (a0)+,d7
  339.         not.b    d5
  340.         not.b    d6
  341.         not.b    d7
  342.         dc.w    2
  343.         move.b    d5,(a1)+
  344.         move.b    d6,(a1)+
  345.         move.b    d7,(a1)+
  346.  
  347. ; void zoom_pixel(int wd, int h, int bytes,int *s, int *d)
  348. ;                      d0      d1     d2        a0       a1
  349.  
  350. zoom_pixel:
  351.         movem.l    d3-d7/a2,-(sp)
  352.  
  353.         move.w    longs,d4    ; faktor*(faktor-1)/2*wd-1
  354.         mulu.w    d0,d4
  355.         subq.w    #1,d4
  356.  
  357.         lsl.w    #4,d0
  358.         subq.w    #1,d0
  359.         subq.w    #1,d1
  360.         subq.w    #1,d2
  361.  
  362. y_loop_p:
  363.         move.w    d0,d3
  364.         move.l    a1,a2
  365.  
  366. make_pixel:
  367.         dcb.w    128,0
  368.  
  369. next_xp:dbra    d3,make_pixel
  370.  
  371.         move.w    d2,d5
  372. x_copy_bytes:
  373.         move.w    d4,d3
  374. x_copy_p:
  375.         rept 8
  376.         move.l    (a2)+,(a1)+
  377.         endm
  378.         dbra    d3,x_copy_p
  379.         dbra    d5,x_copy_bytes
  380.  
  381. next_yp:dbra    d1,y_loop_p
  382.  
  383.         movem.l (sp)+,d3-d7/a2
  384.         rts
  385.  
  386. ; void zoom_inter(int wd, int h, int pl,int *s, int *d)
  387. ;                      d0     d1         d2        a0        a1
  388.  
  389. zoom_inter:
  390.         movem.l    d3-d7/a2-a6,-(sp)
  391.  
  392.         lea.l    ind_tab,a2
  393.         move.w    il_offset,d6    ; Offset : planes*(faktor-1)*2
  394.         move.w    p_faktor,d5
  395.         subq.w    #1,d5
  396.         
  397.         move.w    longs,d3        ; faktor*(faktor-1)/2*wd-1
  398.         mulu.w    d0,d3
  399.         subq.w    #1,d3
  400.         move.w    d3,a5
  401.  
  402.         subq.w    #1,d0
  403.         subq.w    #1,d1
  404.         subq.w    #1,d2
  405.  
  406.         swap    d1
  407.         move.w    d2,d1
  408.         add.w    d1,d1
  409.         swap    d1
  410.  
  411.         btst    #0,d5
  412.         beq.s    y_loop_o
  413.  
  414.         lsr.w    #1,d5
  415.  
  416. y_loop_i:
  417.         swap    d1
  418.         move.w    d0,d3
  419.         move.l    a1,a6
  420.  
  421. x_loop_i:
  422.         move.w    d2,d7
  423.  
  424. planes_i:
  425.         move.l    a6,a3
  426.         addq.w    #2,a6
  427.  
  428.         moveq.l    #0,d4
  429.         move.b    (a0)+,d4
  430.         add.w    d4,d4
  431.         add.w    d4,d4
  432.         move.l    (a2,d4.w),a4
  433.         move.w    d5,d4
  434.  
  435. lo_byte_i:
  436.         move.w    (a4)+,(a3)+
  437.         add.w    d1,a3
  438.         dbra    d4,lo_byte_i
  439.  
  440.         moveq.l    #0,d4
  441.         move.b    (a0)+,d4
  442.         add.w    d4,d4
  443.         add.w    d4,d4
  444.         move.l    (a2,d4.w),a4
  445.         move.w    d5,d4
  446.  
  447. hi_byte_i:
  448.         move.w    (a4)+,(a3)+
  449.         add.w    d1,a3
  450.         dbra    d4,hi_byte_i
  451.  
  452.         dbra    d7,planes_i
  453.         add.w    d6,a6
  454.         dbra    d3,x_loop_i
  455.  
  456.         move.w    d2,d7
  457. x_copy_bytes_i:
  458.         move.w    a5,d3
  459. x_copy_i:
  460.         move.l    (a1)+,(a6)+
  461.         dbra    d3,x_copy_i
  462.         dbra    d7,x_copy_bytes_i
  463.  
  464.         move.l    a6,a1
  465.         swap    d1
  466.         dbra    d1,y_loop_i
  467.  
  468. return_inter:
  469.         movem.l (sp)+,d3-d7/a2-a6
  470.         rts
  471.  
  472. y_loop_o:
  473.         swap    d1
  474.  
  475.         move.w    d0,d3
  476.         move.l    a1,a6
  477.  
  478. x_loop_o:
  479.         move.w    d2,d7
  480.  
  481. planes_o:
  482.         move.l    a6,a3
  483.         addq.w    #2,a6
  484.  
  485.         moveq.l    #0,d4
  486.         move.b    (a0)+,d4
  487.         add.w    d4,d4
  488.         add.w    d4,d4
  489.         move.l    (a2,d4.w),a4
  490.         move.w    d5,d4
  491.  
  492. lo_byte_o:
  493.         move.b    (a4)+,(a3)+
  494.         subq.w    #1,d4
  495.         bmi.s    next_byte_o
  496.  
  497.         move.b    (a4)+,(a3)+
  498.         add.w    d1,a3
  499.         dbra    d4,lo_byte_o
  500.  
  501. next_byte_o:
  502.         moveq.l    #0,d4
  503.         move.b    (a0)+,d4
  504.         add.w    d4,d4
  505.         add.w    d4,d4
  506.         move.l    (a2,d4.w),a4
  507.         move.w    d5,d4
  508.  
  509. hi_byte_o:
  510.         move.b    (a4)+,(a3)+
  511.         subq.w    #1,d4
  512.         bmi.s    next_plane_o
  513.  
  514.         add.w    d1,a3
  515.         move.b    (a4)+,(a3)+
  516.         dbra    d4,hi_byte_o
  517.  
  518. next_plane_o:
  519.         dbra    d7,planes_o
  520.         add.w    d6,a6
  521.         dbra    d3,x_loop_o
  522.  
  523.         move.w    d2,d7
  524. x_copy_bytes_o:
  525.         move.w    a5,d3
  526. x_copy_o:
  527.         move.l    (a1)+,(a6)+
  528.         dbra    d3,x_copy_o
  529.         dbra    d7,x_copy_bytes_o
  530.  
  531.         move.l    a6,a1
  532.         swap    d1
  533.         dbra    d1,y_loop_o
  534.         bra        return_inter
  535.  
  536. ; void cache_flush();
  537.  
  538. cache_flush:
  539.         movec    cacr,d0
  540.         bset    #3,d0
  541.         movec    d0,cacr
  542.         rts
  543.  
  544.         end
  545.